// 导入数据库操作模块
const db = require('../db/index')


/**
 * message_title 消息主题
 * message_category 消息类别
 * message_publish_department 消息发布部门
 * message_publish_name 消息发布者
 * message_receipt_object 消息接收者
 * message_click_number 消息查看数量
 * message_content 消息内容
 * message_publish_time 消息发布时间
 * message_update_time 消息更新时间
 * message_level 消息等级
 * message_status 默认为0 ，1在回收站
 * message_delete_time 消息删除时间
 */

// 发布消息
exports.publishMessage = (req, res) => {
    const {
        message_title,
        message_category,
        message_publish_department,
        message_publish_name,
        message_receipt_object,
        message_content,
        message_level
    } = req.body
    const message_publish_time = new Date()
    const sql = 'insert into message set ? '
    db.query(sql, {
        message_title,
        message_category,
        message_publish_department,
        message_publish_name,
        message_publish_time,
        message_click_number: 0,
        message_status: 0,
        message_receipt_object,
        message_content,
        message_level
    }, (err, result) => {
        if (err) return res.cc(err)
        res.send({
            status: 0,
            message: '发布消息成功',
            department: message_receipt_object,
            id: result.insertId
        })
    })
}

// 获取公司公告列表
exports.companyMessageList = (req, res) => {
    const sql =
        'select * from message where message_category = "公司公告" and message_status = "0" order by message_publish_time DESC limit 5'
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 获取系统消息列表
exports.systemMessageList = (req, res) => {
    const sql =
        'select * from message where message_category = "系统消息" and message_status = "0"  order by message_publish_time DESC limit 5'
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 编辑公告
exports.editMessage = (req, res) => {
    const {
        message_title,
        message_publish_name,
        message_content,
        message_receipt_object,
        message_level,
        id
    } = req.body
    // 通过id返回消息之前的部门
    const returnOldDepartment = id =>{
        return new Promise(resolve=>{
            const sql = 'select message_receipt_object from message where id = ?'
            db.query(sql,id,(err,result)=>{
                resolve(result[0].message_receipt_object)
            })
        })
    }
    // 对消息更改之后的接受部门的所有用户的Read_list进行一个添加id的操作，参数 newDepartment 消息 newid
    const pushIdInReadList = (newDepartment,newid) =>{
        const sql = 'select read_list,read_status,id from users where department = ?'
        db.query(sql, newDepartment, (err, result) => {
            if (err) return res.cc(err)
            result.forEach((e) => {
                if (e.read_status == 1) {
                    let arr = JSON.parse(e.read_list)
                    arr.push(JSON.parse(newid))
                    arr = JSON.stringify(arr)
                    const sql1 = 'update users set read_list = ? where id = ?'
                    db.query(sql1, [arr, e.id], (err, result) => {})
                }
            })
        })
    }

    // 把之前的接受部门的所有用户的ReadList里面的id删掉，参数 oldDepartment deleteid
    const deleteIdInReadList = (oldDepartment,deleteid) =>{
        const sql = 'select read_list,read_status,id from users where department = ?'
        db.query(sql, oldDepartment, (err, result) => {
            if (err) return res.cc(err)
            result.forEach((e) => {
                if (e.read_status == 1) {
                    let arr = JSON.parse(e.read_list)
                    arr = arr.filter(item => {
                        return item != deleteid
                    })
                    arr = JSON.stringify(arr)
                    const sql1 = 'update users set read_list = ? where id = ?'
                    db.query(sql1, [arr, e.id], (err, result) => {})
                }
            })
        })
    }

    // 执行更新操作
    async function change(){
        const receiptObj = await returnOldDepartment(id)
        // 如果返回的部门与修改后的部门不同，并且不等于全体成员
        if(receiptObj!=='全体成员'&&receiptObj!==message_receipt_object){
            pushIdInReadList(message_receipt_object,id)
            deleteIdInReadList(receiptObj,id)
        }
        // 如果要把消息从原来的部门修改为全体成员
        if(message_receipt_object=='全体成员'&&receiptObj!==message_receipt_object){
            deleteIdInReadList(receiptObj,id)
        }
        // 如果原来的消息面对的是全体成员，就需要对新的接收部门的用户的read_list加上id
        if(receiptObj=='全体成员'&&receiptObj!==message_receipt_object){
            pushIdInReadList(message_receipt_object,id)
        }
        const message_update_time = new Date()
        const sql =
            'update message set message_title = ?,message_publish_name= ?,message_content = ? ,message_receipt_object = ?,message_level= ?,message_update_time= ? where id = ?'
        db.query(sql, [
            message_title,
            message_publish_name,
            message_content,
            message_receipt_object,
            message_level,
            message_update_time,
            id
        ], (err, result) => {
            if (err) return res.cc(err)
            res.send({
                status: 0,
                message: '编辑消息成功'
            })
        })
    }
    change()
}


// 根据发布部门进行获取消息
exports.searchMessageBydepartment = (req, res) => {
    const sql = 'select * from message where message_publish_department = ? and message_status = "0"'
    db.query(sql, req.body.message_publish_department, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 根据发布等级进行获取消息
exports.searchMessageByLevel = (req, res) => {
    const sql = 'select * from message where message_level = ? and message_status = "0"'
    db.query(sql, req.body.message_level, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 获取公告/系统消息
exports.getMessage = (req, res) => {
    const sql = 'select * from message where id = ?'
    db.query(sql, req.body.id, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 更新点击率
exports.updateClick = (req, res) => {
    const {
        message_click_number,
        id
    } = req.body
    number = message_click_number * 1 + 1
    const sql = 'update message set message_click_number = ? where id = ?'
    db.query(sql, [number, id], (err, result) => {
        if (err) return res.cc(err)
        res.send({
            status: 0,
            message: '点击率增加'
        })
    })
}

// 初次删除
exports.firstDelete = (req, res) => {
    const message_status = 1
    const message_delete_time = new Date()
    const sql = 'update message set message_status = ? ,message_delete_time = ? where id = ?'
    db.query(sql, [message_status, message_delete_time, req.body.id], (err, result) => {
        if (err) return res.cc(err)
        res.send({
            status: 0,
            message: '删除成功'
        })
    })
}


// 获取回收站的列表
exports.recycleList = (req, res) => {
    const sql = 'select * from message where message_status = 1'
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 获取回收站总数
exports.getRecycleMessageLength = (req, res) => {
    const sql = 'select * from message where message_status = 1'
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send({
            length: result.length
        })
    })
}

// 回收站监听换页
exports.returnRecycleListData = (req, res) => {
    const number = (req.body.pager - 1) * 10
    const sql =
        `select * from message where message_status = 1 ORDER BY message_delete_time limit 10 offset ${number} `
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}


// 还原操作
exports.recover = (req, res) => {
    const message_status = 0
    const message_update_time = new Date()
    const sql = 'update message set message_status = ? ,message_update_time = ? where id = ?'
    db.query(sql, [message_status, message_update_time, req.body.id], (err, result) => {
        if (err) return res.cc(err)
        res.send({
            status: 0,
            message: '还原成功'
        })
    })
}


// 删除操作
exports.deleteMessage = (req, res) => {
    const sql = 'delete from message where id = ?'
    db.query(sql, req.body.id, (err, result) => {
        if (err) return res.cc(err)
        res.send({
            status: 0,
            message: '删除消息成功'
        })
    })
}

// 获取公司公告总数
exports.getCompanyMessageLength = (req, res) => {
    const sql = 'select * from message where message_category ="公司公告"'
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send({
            length: result.length
        })
    })
}

// 获取系统消息总数
exports.getSystemMessageLength = (req, res) => {
    const sql = 'select * from message where message_category ="系统消息"'
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send({
            length: result.length
        })
    })
}

// 监听换页返回数据  公司公告列表
// limit 10 为我们要拿到数据 offset 我们跳过多少条数据
exports.returnCompanyListData = (req, res) => {
    const number = (req.body.pager - 1) * 10
    const sql =
        `select * from message where message_category ="公司公告" and message_status = 0 ORDER BY message_publish_time limit 10 offset ${number} `
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}

// 监听换页返回数据  系统消息列表
exports.returnSystemListData = (req, res) => {
    const number = (req.body.pager - 1) * 10
    const sql =
        `select * from message where message_category ="系统消息"  and message_status = 0  ORDER BY message_publish_time limit 10 offset ${number} `
    db.query(sql, (err, result) => {
        if (err) return res.cc(err)
        res.send(result)
    })
}